/**
 * 创建时间： 2017年5月8日
 *
 * @Copyright 武汉雷软科技有限公司
 */
package com.lrkj.framework.util.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

/**
 * <pre>
 * 创建人： 郭亮
 * 类描述：
 * 版本号：0.0.1
 * 修改人：
 * 修改时间：
 * 修改内容：
 * </pre>
 */
public class SocketUtil {

    /**
     * 日志
     */
    private static final Logger LOG = LoggerFactory.getLogger(SocketUtil.class);

    /**
     * 发送TCP请求
     * 
     * @param msg
     *            发送信息
     * @param host
     *            ip地址
     * @param port
     *            端口
     * @return 返回数据
     */
    public static String send(String msg, String host, int port) {
        LOG.info("发送TCP请求，HOST : {} , PORT : {}", host, port);
        try {
            // 1.建立客户端socket连接，指定服务器位置及端口
            Socket socket = new Socket(host, port);
            // 2.得到socket读写流
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            // 输入流
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 3.利用流按照一定的操作，对socket进行读写操作
            pw.write(msg);
            pw.flush();
            socket.shutdownOutput();
            // 接收服务器的相应
            String reply = null;
            while (!((reply = br.readLine()) == null)) {
                break;
            }
            // 4.关闭资源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
            LOG.info("接受返回值 : {}", reply);
            return reply;
        } catch (Exception e) {
            LOG.error("发送TCP请求异常", e);
            return null;
        }
    }

    @SuppressWarnings("resource")
    public static void main(String[] args) throws Exception {
        new Thread(
                () -> {
                    try {
                        // 1.建立一个服务器Socket(ServerSocket)绑定指定端口
                        ServerSocket serverSocket = new ServerSocket(8888);
                        while (true) {
                            // 2.使用accept()方法阻止等待监听，获得新连接
                            Socket socket = serverSocket.accept();
                            // 3.获得输入流
                            InputStream is = socket.getInputStream();
                            BufferedReader br = new BufferedReader(new InputStreamReader(is));
                            // 获得输出流
                            OutputStream os = socket.getOutputStream();
                            PrintWriter pw = new PrintWriter(os);
                            // 4.读取用户输入信息
                            String info = null;
                            while (!((info = br.readLine()) == null)) {
                                break;
                            }
                            //System.out.println(info);
                            // 给客户一个响应
                            Map<String, Object> map = new HashMap<>();
                            map.put("success", true);
                            // map.put("message", "操作失败");
                            // map.put("data", "ad");
                            pw.write(JSON.toJSONString(map)); // 原样返回
                            pw.flush();
                            // 5.关闭资源
                            pw.close();
                            os.close();
                            br.close();
                            is.close();
                            socket.close();
                        }
                        // serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        ).start();

        // String string = send("AAAAAAAAAAAAAAAAAAAAAAAA", "127.0.0.1", 8888);
        // System.out.println(string);
    }
}
